这是关于网络抓取的问题。我能够使用BeautifulSoup抓取网站,但我想使用XPath,因为Chrome的“复制Xpath”功能使它非常容易。我的理解是Xpath更容易因为使用BeautifulSoup我们需要手动生成的HTML id。
例如,以下是我得到的标题,但必须手动生成“查找”部分。如果是Xpath,我的理解是我可以从Chrome'Inspect Element'窗口中执行“复制XPath”。
import requests
from bs4 import BeautifulSoup
url = "http://www.indeed.com/jobs?q=hardware+engineer&l=San+Francisco%2C+CA"
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
job_titles = soup.find_all("h2", {"class", "jobtitle"})
jobs_sponsored = soup.find_all("div", {"data-tn-component", "sponsoredJob"})
for title in job_titles:
print title.text.strip()
print "SPONSORED JOB LISTINGS"
print "\n"
for sponsored in jobs_sponsored:
print sponsored.text.strip()
使用XPath的等效代码是什么样的?我无法找到关于如何使用Xpath而不是html ids 提取内容的库/语法。
编辑:问题不在于我是否可以将Xpath与BeautifulSoup一起使用(我已经知道我不能)。问题是如果我想使用XPath,上面的一些或所有陈述会是什么样的?我需要使用什么包(我不必使用BeautifulSoup)?
答案 0 :(得分:3)
正如您已经提到的, BeautifulSoup
不提供XPath功能,但内置CSS selectors - 支持有限,但通常已足够对于最常见的用例。以下是在这种情况下如何应用它们:
soup.select("h2.jobtitle")
soup.select("div[data-tn-component=sponsoredJob]")
请注意,Chrome功能中内置的“复制XPath”会生成绝对XPath表达式 - 从根html
元素(或第一个父元素)开始的元素的绝对路径拥有id
属性)。通常情况下,它非常脆弱 - 元素和所需元素的所有父母的相对位置都会使定位器容易破碎 - 在这种情况下,你会非常设计和布局依赖,你应该总是尽量避免。不要只是信任为您自动衍生的定位器Chrome - 看看您是否可以做得更好。
如果您需要内置XPath支持的Python HTML Parser,请查看lxml.html
。