如何从 html 源代码中具有相同属性集和相同层次结构的 2 个元素中抓取单个元素(使用 python 的美丽汤)
Posted
技术标签:
【中文标题】如何从 html 源代码中具有相同属性集和相同层次结构的 2 个元素中抓取单个元素(使用 python 的美丽汤)【英文标题】:How to scrape a single element out of 2 elements having same set of attributes and same hierarchy in html source code (using python's beautiful soup) 【发布时间】:2018-12-04 22:10:36 【问题描述】:我想刮掉图像中以蓝色突出显示的元素。该元素代表特定电影的“票数”。每当我尝试刮掉它时,我也会得到图像中的底部元素,它代表该电影的“集合”,因为两个元素具有相同的属性和相同的层次结构。有没有办法只提取突出显示的元素?
【问题讨论】:
我没有为一部电影选择“no of votes”元素。我正在抓取 2000 部电影的数据。所以我认为 find_all[0] 不是这里的答案。 那么您应该向我们提供有关您的数据的更多信息。我们只能处理你扔给我们的东西。 伙计们,感谢您的帮助!我必须为 2000 部电影获得 2000 个“票数”元素。如果我使用 find_all[0],我只能获得第一部电影的“票数”,而不是全部。我想我必须获得所有 4000 个元素( 'no of votes' 和 'collections')并仅提取具有偶数索引的元素以获得 2000 'no of votes' 元素 【参考方案1】:一种方法可能是遍历<p class="sort-num_votes-visible">
的所有兄弟姐妹,如果您发现<span name="nv">
被<span class="text-muted">
和<span class="ghost">
包围,那么这一定是您正在寻找的跨度。这当然意味着html的这个sn-p的结构总是一样的。如果其中一个span
s 可能丢失,那么此方法显然会失败。
如果保证这两个跨度始终存在并且按照确切的顺序你可以做这样的事情(你的增补 HTML 在html_soup
):
votes = html_soup.find("p", "class": "sort-num_votes-visible").find_all("span", "name": "nv")[0]
编辑:
根据您的评论,您可以执行以下操作来解析多部电影的投票:
for p in html_soup.find("p", "class": "sort-num_votes-visible"):
votes = p.find_all("span", "name": "nv")[0]
< Put whatever code here for each of your movies
...
>
【讨论】:
很高兴我能帮上忙 :) 如果您能接受我的回答,将不胜感激 :)【参考方案2】:你可以使用这样的东西(假设你使用的是 BeautifulSoup):
soup = BeautifulSoup('yourhtml', 'lxml')
p_sort = soup.find('p', 'class':'sort-num_votes-visible')
req_span = p_sort.find_all('span', 'name':'nv')[0]
req_span
将包含您询问的标签。
【讨论】:
【参考方案3】:如果这两个相似的 span 元素的顺序相同,那么您可以选择结果的第一个元素或使用 .find() 而不是 .find_all()[0]。
【讨论】:
【参考方案4】:我认为parsel
是一个更好的 html 解析包,支持xpath
。
from parsel import Selector
s = Selector(text=html)
nv_data = s.xpath('//span[@name="nv"]/@data-value').extract_first()
【讨论】:
以上是关于如何从 html 源代码中具有相同属性集和相同层次结构的 2 个元素中抓取单个元素(使用 python 的美丽汤)的主要内容,如果未能解决你的问题,请参考以下文章