尝试使用BeautifulSoup从我的代码中使用Xpath进行Web抓取

时间:2016-01-04 03:09:15

标签: python python-2.7 xpath web-scraping beautifulsoup

这是关于网络抓取的问题。我能够使用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)?

1 个答案:

答案 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