Python Beautiful Soup查找字符串并提取字符串

时间:2016-07-15 12:08:05

标签: python string beautifulsoup

我正在使用漂亮的汤来编写网络爬虫。我有以下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;事先以字符串为条件。

感谢您的帮助!!!

3 个答案:

答案 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))