【问题标题】:How to use Beautiful Soup to find a tag with changing id?如何使用 Beautiful Soup 查找 id 变化的标签?
【发布时间】:2012-08-09 01:58:16
【问题描述】:

我在 Python 中使用 Beautiful Soup。

这是一个示例网址:

http://www.locationary.com/place/en/US/Ohio/Middletown/McDonald%27s-p1013254580.jsp

在 HTML 中,有一堆标签,我可以指定要查找哪些标签的唯一方法是使用它们的 id。我只想找到电话号码。标签如下所示:

<td class="dispTxt" id="value_xxx_c_1_f_8_a_134242498">5134231582</td> 

我访问了同一网站上的其他 URL,每次都发现电话号码标签的 id 几乎相同。始终保持不变的部分是:

'value_xxx_c_1_f_8_a_'

但是,之后的数字总是会发生变化。有没有办法让 Beautiful Soup 查找 id 的一部分并匹配它,让另一部分像正则表达式一样是数字?

另外,一旦我得到标签,我就想知道......如何在不使用正则表达式的情况下提取电话号码?我不知道 Beautiful Soup 是否可以做到这一点,但它可能比正则表达式更简单。

【问题讨论】:

    标签: python regex beautifulsoup


    【解决方案1】:

    您可以在此处使用CSS Selectors 来匹配属性值前缀:

    soup.select('div[id^="value_xxx_c_1_f_8_a_"]')
    

    这只会匹配带有id 属性的&lt;div&gt; 标记,该属性以字符串value_xxx_c_1_f_8_a_ 开头。

    如果您愿意改用lxml,可以使用 XPath 1.0 表达式来查找这些:

    from lxml import etree
    doc = etree.parse(openfile)
    for elem in doc.xpath('//div[starts-with(@id, "value_xxx_c_1_f_8_a_")]'):
        print elem.text
    

    使用 lxml XPath 表达式将比使用 BeautifulSoup 正则表达式匹配快一个数量级。

    【讨论】:

      【解决方案2】:

      您可以使用正则表达式(此示例匹配标签名称,您需要调整它以匹配元素的 id):

      import re
      for tag in soup.find_all(re.compile("^value_xxx_c_1_f_8_a_")):
          print(tag.name)
      

      【讨论】:

      • 你确定要转义_吗?
      【解决方案3】:

      要获取电话号码,您可以使用 .text 属性。

      tag = soup.find("foo") 
      phone_number = tag.text
      

      【讨论】:

      • 此处完全无关,回答前请阅读问题
      【解决方案4】:

      了解您的文档

      http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

      soup.findAll(id=re.compile("para$"))
      # [<p id="firstpara" align="center">This is paragraph <b>one</b>.</p>,
      #  <p id="secondpara" align="blah">This is paragraph <b>two</b>.</p>]
      

      【讨论】:

        猜你喜欢
        • 2017-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 2020-07-17
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        相关资源
        最近更新 更多