尝试使用 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 从网站中获取所有标题?

在 Python3 中使用 BeautifulSoup4 刮价格 Udemy 网站

Android:尝试使用输入播放列表从我的应用启动音乐播放器