gpt4 book ai didi

python - Beautiful Soup - 在文章中找到第一个链接

转载 作者:可可西里 更新时间:2023-11-01 12:59:10 25 4
gpt4 key购买 nike

我正在为 this problem 创建一个 python 解决方案但我无法克服一些边缘情况。

我遇到的问题出现在像 this 这样的页面上其中 this link是应该提取的那个,因为它是括号外的第一个。反之,有些文章是like this链接出现在第一个括号之前的位置。

我目前处理这些情况的方法是首先遍历第一段标签(字符串化版本)中的元素和文本,然后检查在“(”和 <a> 之间先找到哪个元素和文本。如果<a> 首先找到(意思是在到达括号之前),我只接受那个链接。如果首先找到括号,我等到括号关闭然后接受以下 '

实际上,我只是获取了第一段元素的直接子元素,这可以通过以下方式完成:

soup = BeautifulSoup(response.content, "lxml")
soup.select_one("#mw-content-text > p > a")

我认为在这里可行的是使用这样的选择语句从 <p> 的开头找到前缀中的第一个链接。直到第一个括号或(如果前缀中没有链接)使用类似于我当前正在做的事情找到紧跟在右括号之后的链接:

`findNext('a').attrs['href']`

如果要使用这种方法,则会出现多个问题,包括:1. 如何仅使用 ' 的直接子元素实际获取前缀直到第一个括号

有没有简化的方法来做到这一点?如果有更好的方法,那会是什么?

最佳答案

这个问题让我想起了流行的算法和数据结构问题,当你需要检查括号或其他括号是否平衡时。对于这类问题,堆栈数据结构使用起来很方便。

因此,在这种情况下,我们将如果有左括号则压入堆栈,如果有右括号则从中弹出。对我们来说,有效链接是堆栈为空时的链接:

import requests
from bs4 import BeautifulSoup, NavigableString, Tag


urls = [
"https://en.wikipedia.org/wiki/Modern_Greek",
"https://en.wikipedia.org/wiki/Diglossia"
]

with requests.Session() as session:
for url in urls:
response = session.get(url)
soup = BeautifulSoup(response.content, "html.parser")

stack = []
for child in soup.select_one("#mw-content-text > p").children:
if isinstance(child, NavigableString):
if "(" in child:
stack.append("(")
if ")" in child:
stack.pop()

if isinstance(child, Tag) and child.name == "a" and not stack:
print(child.get_text())
break

它为“Modern Greek”页面打印dialects,为“Diglossia”打印linguistics。两种情况都得到处理。

关于python - Beautiful Soup - 在文章中找到第一个链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43151687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com