我在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 </b>
</font>
</td>
<td width="75%" valign="top" nowrap="">
<font face="Arial" size="-1" color="black">
1698 EIDER DOWN DR<br>SUMMERVILLE SC 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。感谢。
答案 0 :(得分:0)
来自css3选择器docs:
8.3.1。相邻的兄弟组合子
相邻的兄弟组合器由&#34;加号&#34; (U + 002B,+) 分隔两个简单选择器序列的字符。该 由两个序列表示的元素共享同一个父元素 文档树和第一个序列表示的元素 紧接在第二个元素代表的元素之前。
这意味着在您的选择器td b:contains('Owner Address')+td
中,您要求td
与b
具有相同父级的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')
没有文本(仅限子节点),因此上面的代码段仅打印空格。