尝试使用 BeautifulSoup 从我的代码中使用 Xpath 进行网络抓取 [重复]
Posted
技术标签:
【中文标题】尝试使用 BeautifulSoup 从我的代码中使用 Xpath 进行网络抓取 [重复]【英文标题】:Trying to web scrape using Xpath from my code using BeautifulSoup [duplicate] 【发布时间】:2016-04-07 15:43:33 【问题描述】:这是一个关于网络抓取的问题。我可以使用 BeautifulSoup 抓取网站,但我想使用 XPaths,因为 Chrome 的“复制 Xpath”功能使它变得超级简单。我的理解是 Xpath 更容易,因为要使用 BeautifulSoup,我们需要手动生成的 html id。
例如,以下是我得到的标题,但必须手动生成“查找”部分。如果是 Xpath,我的理解是我可以从 Chrome 的“检查元素”窗口中执行“复制 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】:正如您已经提到的,BeautifulSoup
不提供 XPath 功能,但有 CSS selectors 内置 - 支持有限,但通常足以满足最常见的需求用例。以下是在这种情况下如何应用它们:
soup.select("h2.jobtitle")
soup.select("div[data-tn-component=sponsoredJob]")
请注意,Chrome 功能中内置的“复制 XPath”会产生绝对 XPath 表达式 - 从根 html
元素开始的元素的绝对路径(或第一个父元素具有id
属性)。这通常是非常脆弱 - 元素的相对位置和所需元素的所有父级都会使定位器很容易被破坏 - 在这种情况下你会非常设计和布局依赖,你应该总是尽量避免。不要简单地相信 Chrome 为您自动派生的定位器 - 看看您是否可以做得更好。
如果您需要内置 XPath 支持的 Python HTML 解析器,请查看lxml.html
。
【讨论】:
我知道。可能我需要编辑问题的语言,但是我可以使用什么包/语法来使用 XPath 获取相同的数据?我不必使用 BeautifulSoup。 @user1406716 好的,我想你现在可以检查答案了。请注意,如果您正在寻找工具和软件包,那么这将与 SO 无关。 我相信 chrome 的功能将为您提供来自最近父元素的绝对 xpath,并定义了id
。但是是的 +1,它非常脆弱。
@roippi 我也这么认为,谢谢,记下了。以上是关于尝试使用 BeautifulSoup 从我的代码中使用 Xpath 进行网络抓取 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 BeautifulSoup.select 检索整个列表作为文本
使用BeautifulSoup获取产品ID,品牌名称和图像时,在我的代码中出现问题
Python BeautifulSoup 使用标签中的文本并存储为变量
如何使用 BeautifulSoup 从网站中获取所有标题?