【问题标题】:Scrape specific duplicated element from a page从页面中抓取特定的重复元素
【发布时间】:2021-09-04 21:32:08
【问题描述】:

我在抓取这个时遇到了一些问题:

<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa">

在这个字符串之前,我发现已经有 4 个相同但具有不同标记值的字符串,我如何使用 beautifulsoup 从 6 个中刮出第 5 个?

不幸的是,由于我正在从事私人项目,因此我无法提供代码或网站的示例,在将我的问题标记为不完整之前,请提出一些问题,ty!

【问题讨论】:

  • 使用find_all(或findAll)方法,它返回一个列表,然后简单地使用一个索引,你也可以提供一个更小的html示例和那个小示例的代码,基本上仅为这 6 个或任何输入标签编写 html,并为该 html 文档提供代码
  • @Matiiss 你能不能给个sn-p?从未使用过 find_all 函数
  • 它与.find() 相同,除了它返回所有找到的匹配标签的列表,而不仅仅是第一个,只需像使用.find() 一样使用它并打印结果,它应该是一个列表,然后简单地使用索引

标签: python html beautifulsoup


【解决方案1】:

您可以通过两种方式获取第 5 个&lt;input&gt; 标签。

  • 使用select_one() - 选择第5个&lt;input&gt;标签

    x = soup.select_one('input:nth-of-type(5)')
    
  • 通过属性name 使用find_all() - 返回匹配&lt;input&gt; 标记的列表。

    y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
    

如果整个 HTML 中只有这 6 个 &lt;input&gt; 标签,则使用 select_one()

如果您有除这 6 个之外的其他 &lt;input&gt; 标签,那么您必须专门选择您需要的输入标签 - 因此您必须过滤具有属性 name = __RequestVerificationToken 的输入标签。 使用find_all()

此代码将使用select_one()find_all() 打印第5 个输入标签的值。

from bs4 import BeautifulSoup
s = '''
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa1">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa2">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa3">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa4">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5">
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa6">
'''


soup = BeautifulSoup(s, 'lxml')
# Using select_one()
x = soup.select_one('input:nth-of-type(5)')
print(x)
print(x['value'])

# Using find_all()
y = soup.find_all('input', attrs= {'name': '__RequestVerificationToken'})[4]
print(y)
print(y['value'])
<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5

<input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa5"/>
aaa-token-aaa5

【讨论】:

  • 继续得到这个:发生异常:列表索引超出范围重试 3 秒...
【解决方案2】:

find_all() 方法查看标签的后代并检索与您的过滤器匹配的所有后代并将结果作为列表返回。您可以在link 中阅读精美的汤文档以获取更多信息。

要在代码中查找第 5 个元素,请执行以下操作:

from bs4 import BeautifulSoup

html = '''
        <input name="__RequestVerificationToken" type="hidden" value="aaa-token-aaa">
        <input name="__RequestVerificationToken" type="hidden" value="aba-token-aba">
        <input name="__RequestVerificationToken" type="hidden" value="aca-token-aca">
        <input name="__RequestVerificationToken" type="hidden" value="ada-token-ada">
        <input name="__RequestVerificationToken" type="hidden" value="aea-token-aea">
        <input name="__RequestVerificationToken" type="hidden" value="afa-token-afa">
    '''

soup = BeautifulSoup(html, "html.parser")

element = soup.find_all("input")

print(element[4])
print(element[4]["value"])

结果:

<input name="__RequestVerificationToken" type="hidden" value="aea-token-aea"/>
aea-token-aea

请始终尝试像我上面所做的那样使用代码提供较小的 HTML 示例,以避免将您的问题标记为不完整

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多