为什么BeautifulSoup第二次解析,但不是第一次解析

时间:2016-10-11 22:25:50

标签: python html beautifulsoup

这是运行ResultSet的{​​{1}}:

soup[0].find_all('div', {'class':'font-160 line-110'})

尝试在[<div class="font-160 line-110" data-container=".snippet-container" data-html="true" data-placement="top" data-template='&lt;div class="tooltip infowin-tooltip" role="tooltip"&gt;&lt;div class="tooltip-arrow"&gt;&lt;div class="tooltip-arrow-inner"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="tooltip-inner" style="text-align: left"&gt;&lt;/div&gt;&lt;/div&gt;' data-toggle="tooltip" title="XIAMEN [CN]"> <a class="no-underline group-ib color-inherit" href="/en/ais/details/ports/959"> <span class="text-default">CN</span><span class="text-default text-darker">XMN </span> </a> </div>] 之后提取XIAMEN [CN]我无法使用title(其中a[0].find('div')['title]是上述a)。但是,如果我将该HTML复制并粘贴为新字符串,例如

BeautifulSoup ResultSet

然后做:

b = '''<div class="font-160 line-110" data-container=".snippet container" data-html="true" data-placement="top" data-template='&lt;div class="tooltip infowin-tooltip" role="tooltip"&gt;&lt;div class="tooltip-arrow"&gt;&lt;div class="tooltip-arrow-inner"&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="tooltip-inner" style="text-align: left"&gt;&lt;/div&gt;&lt;/div&gt;' data-toggle="tooltip" title="XIAMEN [CN]">'''

为什么我要重新汤?为什么这不适用于我的第一次搜索?

编辑,>>soup = BeautifulSoup(b, 'html.parser') >>soup.find('div')['title'] >>XIAMEN [CN] #prints contents of title 的来源:

我有一个soup的列表,我通过urls找到了。我正在寻找的一件事是grequests包含title

所以当我做

时创建了XIAMEN [CN]
soup

网址是

soup = []
    with i in range(2) #number of pages parsed
     rawSoup = BeautifulSoup(response[i].content, 'html.parser')   
     souporigin = rawSoup.find_all('div', {'class': 'bg-default bg-white no-    snippet-hide'})
    soup.append(souporigin)

2 个答案:

答案 0 :(得分:1)

我发现设置BeautifulSoup时出现了问题。我创建了一个部分搜索结果列表,然后不得不迭代列表来研究它。我通过在线搜索我想要的东西来解决这个问题:

我改变了:

struct mystruct  {  int field; };

mystruct *foo(bool arg1, int val)
{
  mystruct ptr = nullptr;

  if (!arg1)  return ptr;

  if (val  > 2 )
    ptr = new mystruct;


  ptr->field = val; // <<<< -- here 

  return ptr;
}

到:

soup = []
    with i in range(2) #number of pages parsed
     rawSoup = BeautifulSoup(response[i].content, 'html.parser')   
     souporigin = rawSoup.find_all('div', {'class': 'bg-default bg-white no-    snippet-hide'})
     soup.append(souporigin)

在我创建 a = soup.find("div", class_='font-160 line-110')["title"] 后立即运行此搜索,这会删除代码中的大量冗余 - 我一直在创建soup列表并且必须使用ResultSets他们为新的领域。

答案 1 :(得分:0)

您使用了错误的选择。

选择soup[0].find_all('div', {'class':'font-160 line-110'})找到<div>,您甚至可以在打印时看到<div>。但是当您添加.find()时,它会开始在内搜索 <div> - 所以.find('div')会尝试在当前div中找到新的div

你需要

a[0]['title']

当你创建新的汤时,main / root元素不是div但是[document]div是它的孩子(div在main“tag”中)所以你可以使用find('div')

>>> a[0].name
div

>>> soup = BeautifulSoup(b, 'html.parser')
>>> soup.name
[document]