【问题标题】:How to find certain text using selectors?如何使用选择器查找某些文本?
【发布时间】:2017-11-03 13:26:46
【问题描述】:

我已经在 python 中编写了一个脚本来查找 td 标记中的文本,这是第一个 tdtag 的 next sibling,使用 BeautifulSoup 和 css 选择器。如果我运行脚本,我发现它可以工作。但是,当我使用lxml 库执行相同操作时,它不再起作用。我怎样才能让我的后一个脚本工作?谢谢。

这是内容:

html_content="""
<tr>
  <td width="25%" valign="top" bgcolor="lightgrey" nowrap="">
      <font face="Arial" size="-1" color="224119">
        <b>Owner Address&nbsp;</b>
      </font>
  </td>
  <td width="75%" valign="top" nowrap="">
      <font face="Arial" size="-1" color="black">
        1698 EIDER DOWN DR<br>SUMMERVILLE&nbsp;SC&nbsp;29483
      </font>
  </td>
</tr>
"""

使用 bs4:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content,"lxml")
item = soup.select("td")[0].find_next_sibling().text
print(item)

结果:

1698 EIDER DOWN DRSUMMERVILLE SC 29483

下面的脚本可以找到地址字符串:

from lxml.html import fromstring
root = fromstring(html_content)
item = root.cssselect("td b:contains('Address')")[0].text
print(item)

结果:

Owner Address

在查找下一个兄弟时不起作用(应用“+”号查找下一个兄弟:

from lxml.html import fromstring
root = fromstring(html_content)
item = root.cssselect("td b:contains('Owner Address')+td")[0].text
print(item)

结果:

Traceback (most recent call last):
  File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\new_line_one.py", line 28, in <module>
    item = root.cssselect("td b:contains('Owner Address')+td")[0].text
IndexError: list index out of range

我怎样才能找到下一个兄弟姐妹?顺便说一句,我只关注css选择器而不是xpath。谢谢。

【问题讨论】:

    标签: python python-3.x web-scraping css-selectors lxml


    【解决方案1】:

    来自 css3 选择器docs

    8.3.1。相邻兄弟组合器

    相邻的兄弟组合子由“加号”(U+002B,+)组成 分隔两个简单选择器序列的字符。这 由两个序列表示的元素在 文档树和第一个序列表示的元素 紧接在第二个表示的元素之前。

    这意味着在您的选择器td b:contains('Owner Address')+td 中,您要求的td 与包含“地址”的b 具有相同的父级,并且是另一个td 的子级。该节点不存在。要使其工作,您需要确保您的第一个部分选择器与td 匹配,而不是b 节点。由于它们相互包含,因此可以使用以下方法:

    td:contains('Owner Address') + td
    

    请注意,这个 td 没有文本(只有子节点),所以你的 sn-p 从上面只打印空格。

    【讨论】:

    • 感谢您为我指明正确的方向。它会改为root.cssselect("td:contains('Owner Address') + td")[0].text_content()
    猜你喜欢
    • 2018-01-05
    • 2015-07-17
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多