我正在使用漂亮的汤来编写网络爬虫。我有以下HTML代码:
<tr class="odd-row">
<td>xyz</td>
<td class="numeric">5,00%</td>
</tr>
<tr class="even-row">
<td>abc</td>
<td class="numeric">50,00%</td
</tr>
<tr class="odd-row">
<td>ghf</td>
<td class="numeric">2,50%</td>
我的目标是在课后编写数字=&#34;数字&#34;到一个特定的变量。我想以类语句上方的字符串为条件(例如&#34; xyz&#34;,&#34; abc&#34;,...)。
目前我正在做以下事情:
for c in soup.find_all("a", string=re.compile('abc')):
abc=c.string
但当然它会返回字符串&#34; abc&#34;而不是之后标签中的数字。 所以基本上我的问题是如何在课后输入字符串=&#34;数字&#34;事先以字符串为条件。
感谢您的帮助!!!
答案 0 :(得分:1)
一旦找到了正确的 td ,我认为这就是你想要取代 a 的意思,那就得到你想要的下一个兄弟:
h = """<tr class="odd-row">
<td>xyz</td>
<td class="numeric">5,00%</td>
</tr>
<tr class="even-row">
<td>abc</td>
<td class="numeric">50,00%</td
</tr>
<tr class="odd-row">
<td>ghf</td>
<td class="numeric">2,50%</td>"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(h)
for td in soup.find_all("td",text="abc"):
print(td.find_next_sibling("td",class_="numeric"))
如果数字td始终是下一个,您只需调用 find_next_sibling():
for td in soup.find_all("td",text="abc"):
print(td.find_next_sibling())
对于你的输入,两者都会给你:
td class="numeric">50,00%</td>
答案 1 :(得分:0)
如果我正确理解您的问题,并且如果我认为您的HTML代码将始终遵循您的示例结构,则可以执行此操作:
result = {}
table_rows = soup.find_all("tr")
for row in table_rows:
table_columns = row.find_all("td")
result[table_columns[0].text] = tds[1].text
print result #### {u'xyz': u'2,50%', u'abc': u'2,50%', u'ghf': u'2,50%'}
你最后得到一个字典,其中的关键名是'xyz','abc'等等,它们的值是class="numeric"
答案 2 :(得分:0)
因此,我理解你的问题,你想迭代元组 ('xyz','5,00%'),('abc','50,00%'),('ghf','2,50%')。这是对的吗?
但是我不明白你的代码是如何产生任何结果的,因为你正在搜索<a>
标签。
相反,您应该遍历<tr>
标记,然后将字符串置于<td>
标记内。注意用于访问第二个next_sibling
的双<td>
,因为第一个next_sibling
将引用两个标记之间的空格。
html = """
<tr class="odd-row">
<td>xyz</td>
<td class="numeric">5,00%</td>
</tr>
<tr class="even-row">
<td>abc</td>
<td class="numeric">50,00%</td
</tr>
<tr class="odd-row">
<td>ghf</td>
<td class="numeric">2,50%</td>
</tr>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
for tr in soup.find_all("tr"):
print((tr.td.string, tr.td.next_sibling.next_sibling.string))