Python 如何使用beautifulsoup从html标记的特定类获取数据?

Python 如何使用beautifulsoup从html标记的特定类获取数据?,python,beautifulsoup,scrape,Python,Beautifulsoup,Scrape,我想从如下HTML文件中获取div标记中的数据(姓名、城市和地址): <div class="mainInfoWrapper"> <h4 itemprop="name">name</h4> <div> <a href="/Wiki/Province/Tehran"></a> city <a href="/Wiki/City/Tehran"><

我想从如下HTML文件中获取
div
标记中的数据(姓名、城市和地址):

<div class="mainInfoWrapper">
    <h4 itemprop="name">name</h4>
    <div>
        <a href="/Wiki/Province/Tehran"></a>
         city
        <a href="/Wiki/City/Tehran"></a>
         Address
    </div>
</div>

名称
城市
住址
我不知道如何才能在特定的标签中获取所需的数据。
显然,我正在使用python和
beautifulsoup

您可以使用内置的
lxml.html
模块:

>>> s="""<div class="mainInfoWrapper">
...     <h4 itemprop="name">name</h4>
...     <div>
...         <a href="/Wiki/Province/Tehran"></a>
...          city
...         <a href="/Wiki/City/Tehran"></a>
...          Address
...     </div>
... </div>"""
>>> 
>>> import lxml.html
>>> document = lxml.html.document_fromstring(s)
>>> print document.text_content().split()
['name', 'city', 'Address']
要从特定标记获取文本,只需使用
soup.find_all

soup = BeautifulSoup(your_HTML_source)
for line in soup.find_all('div',attrs={"class" : "mainInfoWrapper"}):
    print line.text

如果h4仅使用一次,则可以执行以下操作-

name = soup.find('h4', attrs={'itemprop': 'name'})
print name.text
parentdiv = name.find_parent('div', class_='mainInfoWrapper')
cityaddressdiv = name.find_next_sibling('div')
源HTML中有几个
标记,但只有一个
具有
itemprop=“name”
属性,因此您可以先搜索该标记。然后从那里访问其余的值。请注意,以下HTML是从源页面正确复制的,而问题中的HTML不是:

from bs4 import BeautifulSoup

html = '''<div class="mainInfoWrapper">
    <h4 itemprop="name">            
        NAME
        &nbsp;                          

    </h4>                           
    <div>                           
        <a href="/Wiki/Province/Tehran">PROVINCE</a> - <a href="/Wiki/City/Tehran">CITY</a> ADDRESS
    </div>                          
</div>'''

soup = BeautifulSoup(html)
name_tag = soup.find('h4', itemprop='name')
addr_div = name_tag.find_next_sibling('div')
province_tag, city_tag = addr_div.find_all('a')

name, province, city = [t.text.strip() for t in name_tag, province_tag, city_tag]
address = city_tag.next_sibling.strip()

我不确定终端上打印的输出是否正确,但是,此代码应该为正确配置的终端生成正确的文本。

我得到了名称,但做了如下操作:name_b=soup1.find('h4'))对于名称中的child_b.children name=child h4,在该页面中只使用了一次,但有许多div标签没有特殊id,我不知道如何访问它们。您能否展示多个
div
s的结构,这将影响答案。您可以看到我在此处抓取的web:谢谢Kasra,我的代码是更大的HTML文档的一部分,但我只需要在question@Mehdi欢迎使用,在这种情况下,只需使用
find_all
。我尝试了name=div_tag.text.split(),结果如下:“u0627\u0627\u0627\u0627\u0627\u0631\u0627\u0627\u0627\u0646“u”中国“u”的“u’\U067\u0647\u0647\u0628\u0628\u0628\u0628\u0628\u0628\u0628\u0628\英国英国厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄厄布布布布布布布布布布布布布布布布布布布布布布\U067\U067\U067\U067\\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\U067\u0647\u0647\u0647\U06,u'\u0641\u0644\u06a9\u0647',u'\u0633\u0648\u0645',u'\u062a\u0647\u0631\u0627\u0646\u067e\u0627\u0631\u0633']@Mehdi:我已经更新了我的答案。当你试图为你的问题总结源HTML时,你没有正确地复制源HTML。省和市值是
标记的子项,而不是兄弟项。地址是
标记的兄弟项。此外还有多个
标记,但幸运的是只有一个带有
itemprop=“name”
attribute。它工作正常,给了我想要的东西!:)但是因为我是beatifulsoap的新手,当然还有ptyhon,我无法理解名称、省和市获得值的行中发生了什么?这称为列表/元组解包。RHS是一个列表理解,它迭代每个标记并获取其文本。这创建了一个l三个项目(标记文本)的列表,然后将其解压为变量名称、省和市。它相当于这些单独的赋值:
name=name\u标记.text.strip()
province=province\u标记.text.strip()
city=city\u标记.text.strip()
。地址是一个特例,因此不能使用相同的方法。
from bs4 import BeautifulSoup

html = '''<div class="mainInfoWrapper">
    <h4 itemprop="name">            
        NAME
        &nbsp;                          

    </h4>                           
    <div>                           
        <a href="/Wiki/Province/Tehran">PROVINCE</a> - <a href="/Wiki/City/Tehran">CITY</a> ADDRESS
    </div>                          
</div>'''

soup = BeautifulSoup(html)
name_tag = soup.find('h4', itemprop='name')
addr_div = name_tag.find_next_sibling('div')
province_tag, city_tag = addr_div.find_all('a')

name, province, city = [t.text.strip() for t in name_tag, province_tag, city_tag]
address = city_tag.next_sibling.strip()
import requests
from bs4 import BeautifulSoup

r = requests.get('http://goo.gl/sCXNp2')
soup = BeautifulSoup(r.content)
name_tag = soup.find('h4', itemprop='name')
addr_div = name_tag.find_next_sibling('div')
province_tag, city_tag = addr_div.find_all('a')

name, province, city = [t.text.strip() for t in name_tag, province_tag, city_tag]
address = city_tag.next_sibling.strip()

>>> print name
بیمارستان حضرت فاطمه (س)
>>> print province
تهران
>>> print city
تهران
>>> print address
یوسف آباد، خیابان بیست و یکم، جنب پارک شفق، بیمارستان ترمیمی پلاستیک فک و صورت