【问题标题】:Extracting text with no tags/formatting in HTML file with Robobrowser, Beautifulsoup in Python使用Robobrowser,Python中的Beautifulsoup在HTML文件中提取没有标签/格式的文本
【发布时间】:2018-10-16 14:18:39
【问题描述】:
<font color="white">
    <b>Name:</b> USERNAME [585743] <br>  
    <b>Money:</b> $MONEY <br>   
    <b>Location:</b> CITY<br>
    <b>Level:</b> 43<br>
    <b>Gold:</b> 4706 / 5315<br>
</font>

我在一个杂乱的页面中有这个 HTML。我想提取每个&lt;/b&gt;&lt;br&gt; 之间的元素。它们是纯文本,没有我可以使用的有用的类或 ID。

到目前为止我使用过的代码:

browser.open(bank_url)

soup = browser.parsed


result2 = re.search(r'</b> (.*?)<br/>', src).group(0)
print(result2)

这导致了

</b> USERNAME [585743] <br> 

正在打印。这是一个好的开始,但由于某种原因,我无法打印更多元素?

有没有办法只提取一段特定的文本?例如金色文字 4706 / 5315 ?

我在 python 3.6 中使用 robobrowser,beautifulsoup

【问题讨论】:

    标签: python-3.x beautifulsoup robobrowser


    【解决方案1】:

    如果你使用 beautifulsoup,你应该首先创建 BeautifulSoup 对象:

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup('''<font color="white">)
         <b>Name:</b> USERNAME [585743] <br>  
         <b>Money:</b> $MONEY <br>   
         <b>Location:</b> CITY<br>
         <b>Level:</b> 43<br>
         <b>Gold:</b> 4706 / 5315<br>
    </font>''', 'html.parser')
    

    然后你可以解析你需要的文本,找到&lt;b&gt;元素并获取它们的next_sibling

    >>> for i in soup.findAll('b'):
         print(i.next_sibling)
    
     USERNAME [585743] 
     $MONEY 
     CITY
     43
     4706 / 5315
    

    【讨论】:

    • 我不明白,代码块是大型网站的一小块。我的问题是我没有一个好的方法来告诉 beautifulsoup 选择什么。我如何告诉它选择你在那里复制的所有内容?
    • 你可以使用字体标签,如果你确定块总是在里面
    • 我已经尝试过字体标签,但由于某种原因,我在处理多行时遇到了很多麻烦。不使用正则表达式怎么做字体标签?
    【解决方案2】:

    使用.next_sibling,您可以从元素中获取Gold: 旁边的值。这就是这种方法的样子:

    from bs4 import BeautifulSoup
    
    element = """
    <font color="white">
        <b>Name:</b> USERNAME [585743] <br>  
        <b>Money:</b> $MONEY <br>   
        <b>Location:</b> CITY<br>
        <b>Level:</b> 43<br>
        <b>Gold:</b> 4706 / 5315<br>
    </font>
    """
    soup = BeautifulSoup(element,"lxml")
    item = [elem.next_sibling.strip() for elem in soup.select("font b") if "Gold" in elem.text]
    print(' '.join(item))
    

    输出:

    4706 / 5315
    

    【讨论】:

    • 我猜你可以直接使用soup.find('b', text='Gold:').next_sibling
    • 是的,我一开始就注意到了,但问题是:上面粘贴的 OP 元素是一大块分散的缺陷。因此,如果有另一个容器具有另一个标签名称(font 除外)将Gold: 作为项目,那么代码将给出错误的结果。谢谢。
    • 感谢您的回复,是的,该网站一团糟,没有任何 div 标签。它只是一堆 和 和 几乎没有任何类。我会试试你说的。我还有 1 个问题,我使用 robobrowser 登录网站,soup.find 的东西会让我保持登录状态吗?我是新手。我遇到的一个问题是,如果我运行 html 请求,它会获取已注销的站点。
    • BeautifulSoup 在登录过程中不起任何作用。它是目前最好的解析器之一。它可以帮助您从任何浏览器模拟器或 http 请求生成的元素中获取文本。所以它不应该与您的登录事物有任何冲突。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多