代码之家  ›  专栏  ›  技术社区  ›  koshiboto

使用python(bs4)从段落中获取第一个不位于括号之间的常规链接

  •  1
  • koshiboto  · 技术社区  · 2 年前

    我需要使用bs4用python编写一个程序,向我显示一个维基百科站点到另一个站点的路径,为此,我必须获取当前维基百科站点的第一个链接,该链接位于第一段中的“div”,id=bodycontent。

    但是,有一个限制,我必须选择第一个不位于括号fe之间的链接:

    认识论(pstmldi/(listen);从古希腊语来看,“知识”和“逻辑学”是与知识有关的哲学分支。认识论者研究知识的性质、起源和范围、认识的正当性、信仰的合理性以及各种相关问题。认识论与伦理学、逻辑学和形而上学等其他主要分支一样,被认为是哲学的一个主要分支。[1]

    在这一段中,古希腊语是一个链接,但我不能使用这个链接,因为它位于括号之间,所以我必须使用的链接是 哲学分支 ( https://en.wikipedia.org/wiki/Epistemology )。

    我的问题是,我不知道如何找到第一段括号之外的第一个链接。这是我已经拥有的:

    while current != end:
    
            session.get(url)
            response = session.get(url)
            d = BeautifulSoup(response.content, 'html.parser')
            body = d.find('div',id = "bodyContent")
            d = body.find("p")
            while d.find('a') == None:
                d = d.findNext("p")
    
            d = d.find("a")```
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Andrej Kesely    2 年前

    一种解决方案是将第一段作为文本,替换为 ( ) 并再次解析它。例如:

    import requests
    from bs4 import BeautifulSoup
    
    
    url = "https://en.wikipedia.org/wiki/Epistemology"
    
    soup = BeautifulSoup(requests.get(url).content, "html.parser")
    
    txt = (
        str(soup.select_one(".mw-parser-output p:has(a)"))
        .replace("(", "<bracket>")
        .replace(")", "</bracket>")
    )
    
    soup = BeautifulSoup(txt, "html.parser")
    
    a = soup.find(lambda tag: tag.name == "a" and not tag.find_parent("bracket"))
    print(a)
    

    打印:

    <a href="/wiki/Outline_of_philosophy" title="Outline of philosophy">branch of philosophy</a>