【问题标题】:Finding specific links with Beautiful Soup查找 Beautiful Soup 的特定链接
【发布时间】:2016-10-07 17:32:50
【问题描述】:

我正在使用 Beautiful Soup for Python 来解析网页,以便从某些文件下载数据并将它们聚合到一个文件中。我正在解析的网页包含大量不同的下载链接,我无法获取我想要的特定链接。

HTML 基本上是这样设置的:

<li> <b>data I dont care about: </b>
<a href ="/id#____dontcare2010">2010</a> <a href = "/id#____dontcare2011">2011</a> (and so on)
</li>

<li> <b>data I DO care about: </b>
< a href ="/id#___data2010">2010</a> <a href= "/id#____data2011">2011</a> ....
</li>

(id#____ 只是该网页包含信息的特定对象的 id 号,对于这个问题不太重要,但我想我会尽可能准确)

我想要让 BeautifulSoup 找到包含字符串“我关心的链接:”的列表(“&lt;li&gt;”标签),然后将该列表中的每个链接存储到 Python 列表中。我试过了,

soup.findAll('li', text = 'Links I DO care about: ")

但这似乎不起作用......

我想有一些方法可以用 Beautiful Soup 完成这些步骤: 1.找到我想要的特定列表 2. 在该列表中找到所有&lt;a href="..."&gt;&lt;/a&gt;tags 3. 将所有这些链接存储在 Python 列表中。

不过我似乎找不到办法。

有什么建议吗?

【问题讨论】:

  • 您必须拥有某些您期望的特定链接。那么,为什么不使用正则表达式并过滤掉这些 url?

标签: python beautifulsoup


【解决方案1】:

text 参数(现在称为 string)不会在子元素中搜索元素的文本(为什么?- 请参阅此 documentation paragraph 中的最后一个注释,.string 将有效地为 @987654327 @ 表示每个呈现的li 元素)。我要做的是通过文本定位b元素,然后获取所有asiblings

b = soup.find("b", text=lambda text: text and "data I DO care about:" in text)
links = [a["href"] for a in b.find_next_siblings("a", href=True)]
print(links)

或者,您可以将go up the treeb 变为li,然后使用find_all() 查找li 内的所有链接:

b = soup.find("b", text=lambda text: text and "data I DO care about:" in text)
li = b.find_parent("li")
links = [a["href"] for a in li.find_all("a", href=True)]
print(links)

当然,还有其他方法可以定位所需的a 元素。

【讨论】:

  • 不应该是text=lambda text: text and "data I DO care about:" in text 吗?
猜你喜欢
  • 2013-07-15
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多