如何使用选择器查找某些文本?

时间:2017-11-03 13:26:46

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

我在python中编写了一个脚本,用于查找td标记内的文本,该文本是使用BeautifulSoup结合css选择器的第一个next sibling标记的td。如果我运行脚本,我发现它工作。但是,当我使用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。感谢。

1 个答案:

答案 0 :(得分:0)

来自css3选择器docs

  

8.3.1。相邻的兄弟组合子

     

相邻的兄弟组合器由&#34;加号&#34; (U + 002B,+)   分隔两个简单选择器序列的字符。该   由两个序列表示的元素共享同一个父元素   文档树和第一个序列表示的元素   紧接在第二个元素代表的元素之前。

这意味着在您的选择器td b:contains('Owner Address')+td中,您要求tdb具有相同父级的td包含&#39;地址&#39;并且是另一个td的孩子。此节点不存在。要使其工作,您需要确保您的第一个部分选择器与b匹配,而不是td:contains('Owner Address') + td 节点。由于它们彼此包含,以下内容可行:

td

请注意,此users.filter(email.like("%@mac.com")) // SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com') 没有文本(仅限子节点),因此上面的代码段仅打印空格。