在浏览器中使用 CSS 选择器从包含 HTML 标记的字符串中抓取数据,而不创建 DOM 元素?
Scraping data from a string containing HTML markup, in the browser, using CSS selectors and without creating the DOM elements?
我已经尝试这个简单的任务好几个小时了。似乎没有可用的库可以提供帮助,这里也没有问题似乎可以解决这种情况。
这很简单:
- 我将整个页面的标记作为字符串。
- 我需要使用CSS选择器指向元素我需要从中抓取数据。
- 我不想创建实际的 HTML DOM 元素。只从他们那里抓取数据。 该页面可能包含我不想创建的图像、音频、视频和其他元素。
- 它需要能够处理标记错误和 HTML5 式标记。目前,尝试将其解析为 XML 会引发 "Invalid XML" 异常。
- 它需要在浏览器中发生。所以,没有 NodeJS 模块。
在 JAVA 中,我已经能够使用 JSoup 做到这一点。但是在浏览器上似乎没有 JS 运行 的等效库。
感谢您的宝贵时间。
@JaromandaX 的建议是正确的。一种方法是使用 DOMParser
对象。它允许您创建元素,然后在它们上使用 .querySelector
或 .querySelectorAll
,同时 不加载任何外部资源或 运行 任何脚本 .
这对我有用:
var parser = new DOMParser();
var doc = parser.parseFromString(markup, "text/html");
您可以使用 PHP Goutte or Python's BeautifulSoup4 库,您也可以在其中使用 CSS Selectors
或 XPaths
,无论您喜欢什么。
这里有一些简单的入门示例。
PHP古特:
require_once 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$resp = $client->request('GET', $url);
foreach ($resp->filter(' your css selector here') as $li) {
// your logic here
}
Python BeautifulSoup 示例:
import requests
from bs4 import BeautifulSoup
timeout_time = 30;
def tryAgain(passed_url):
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
return page
except Exception:
while 1:
print("Trying again the URL:")
print(passed_url)
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
print("-------------------------------------")
print("---- URL was successfully scraped ---")
print("-------------------------------------")
return page
except Exception:
time.sleep(20)
continue
header = [{"User-Agent": "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"},
{"User-Agent":"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"},
{"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201"},
{"User-Agent":"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"}]
main_url = " your URL here "
main_page_html = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html, "html.parser")
for a in main_page_soup.select(' css selector here '):
print a.select(' your css selector here ')[0].text
我已经尝试这个简单的任务好几个小时了。似乎没有可用的库可以提供帮助,这里也没有问题似乎可以解决这种情况。
这很简单:
- 我将整个页面的标记作为字符串。
- 我需要使用CSS选择器指向元素我需要从中抓取数据。
- 我不想创建实际的 HTML DOM 元素。只从他们那里抓取数据。 该页面可能包含我不想创建的图像、音频、视频和其他元素。
- 它需要能够处理标记错误和 HTML5 式标记。目前,尝试将其解析为 XML 会引发 "Invalid XML" 异常。
- 它需要在浏览器中发生。所以,没有 NodeJS 模块。
在 JAVA 中,我已经能够使用 JSoup 做到这一点。但是在浏览器上似乎没有 JS 运行 的等效库。
感谢您的宝贵时间。
@JaromandaX 的建议是正确的。一种方法是使用 DOMParser
对象。它允许您创建元素,然后在它们上使用 .querySelector
或 .querySelectorAll
,同时 不加载任何外部资源或 运行 任何脚本 .
这对我有用:
var parser = new DOMParser();
var doc = parser.parseFromString(markup, "text/html");
您可以使用 PHP Goutte or Python's BeautifulSoup4 库,您也可以在其中使用 CSS Selectors
或 XPaths
,无论您喜欢什么。
这里有一些简单的入门示例。
PHP古特:
require_once 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$resp = $client->request('GET', $url);
foreach ($resp->filter(' your css selector here') as $li) {
// your logic here
}
Python BeautifulSoup 示例:
import requests
from bs4 import BeautifulSoup
timeout_time = 30;
def tryAgain(passed_url):
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
return page
except Exception:
while 1:
print("Trying again the URL:")
print(passed_url)
try:
page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text
print("-------------------------------------")
print("---- URL was successfully scraped ---")
print("-------------------------------------")
return page
except Exception:
time.sleep(20)
continue
header = [{"User-Agent": "Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"},
{"User-Agent":"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14"},
{"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201"},
{"User-Agent":"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25"}]
main_url = " your URL here "
main_page_html = tryAgain(main_url)
main_page_soup = BeautifulSoup(main_page_html, "html.parser")
for a in main_page_soup.select(' css selector here '):
print a.select(' your css selector here ')[0].text