我正在使用Python和BeautifulSoup进行网页抓取.
让我说我有以下HTML代码来刮:
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>
Run Code Online (Sandbox Code Playgroud)
使用BeautifulSoup,我想找到属性class ="product"(仅限产品1和2)的产品,而不是'特殊'产品
如果我执行以下操作:
result = soup.find_all('div', {'class': 'product'})
Run Code Online (Sandbox Code Playgroud)
结果包括所有产品(1,2,3和4).
如何找到类别与"产品"完全匹配的产品?
我运行的代码:
from bs4 import BeautifulSoup
import re
text = """
<body>
<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product special">Product 3</div>
<div class="product special">Product 4</div>
</body>"""
soup = BeautifulSoup(text)
result = soup.findAll(attrs={'class': re.compile(r"^product$")})
print result
Run Code Online (Sandbox Code Playgroud)
输出:
[<div class="product">Product 1</div>, <div class="product">Product 2</div>, <div class="product special">Product 3</div>, <div class="product special">Product 4</div>]
Run Code Online (Sandbox Code Playgroud) 我有一个更大的文档中的以下HTML
<br />
Important Text 1
<br />
<br />
Not Important Text
<br />
Important Text 2
<br />
Important Text 3
<br />
<br />
Non Important Text
<br />
Important Text 4
<br />
Run Code Online (Sandbox Code Playgroud)
我目前正在使用BeautifulSoup来获取HTML中的其他元素,但我还没有找到一种方法来获取<br />标记之间的重要文本行.我可以隔离并导航到每个<br />元素,但无法找到获取文本的方法.任何帮助将不胜感激.谢谢.
我想要做一些屏幕抓取与Python 2.7,以及我对之间的差异没有上下文HTMLParser,SGMLParser或者美味的汤.
这些都试图解决同样的问题,还是因为不同的原因而存在?哪个最简单,最强大,哪个(如果有的话)是默认选择?
另外,如果我忽略了一个重要选项,请告诉我.
编辑:我应该提一下,我在HTML解析方面并不是特别有经验,而且我特别感兴趣的是哪个会让我最快速地移动,目标是在一个特定网站上解析HTML.
pip install http://www.crummy.com/software/BeautifulSoup/unreleased/4.x/BeautifulSoup-4.0b.tar.gz
Run Code Online (Sandbox Code Playgroud)
这个安装包bs4,一切都好.但是,如果我将此行添加到requirements.txt
http://www.crummy.com/software/BeautifulSoup/unreleased/4.x/BeautifulSoup-4.0b.tar.gz
Run Code Online (Sandbox Code Playgroud)
并运行
pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
输出是
Downloading/unpacking http://www.crummy.com/software/BeautifulSoup/unreleased/4.x/BeautifulSoup-4.0b.tar.gz (from -r requirements.txt (line 40))
Downloading BeautifulSoup-4.0b.tar.gz (42Kb): 42Kb downloaded
Running setup.py egg_info for package from http://www.crummy.com/software/BeautifulSoup/unreleased/4.x/BeautifulSoup-4.0b.tar.gz
Run Code Online (Sandbox Code Playgroud)
但是包没有安装.
>>> import bs4
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named bs4
Run Code Online (Sandbox Code Playgroud) 在3之前的BeautifulSoup版本中,我可以使用任何一块HTML并以这种方式获取字符串表示:
from BeautifulSoup import BeautifulSoup
soup3 = BeautifulSoup('<div><b>soup 3</b></div>')
print unicode(soup3)
'<div><b>soup</b></div>'
Run Code Online (Sandbox Code Playgroud)
但是使用BeautifulSoup4时,相同的操作会创建其他标签:
from bs4 import BeautifulSoup
soup4 = BeautifulSoup('<div><b>soup 4</b></div>')
print unicode(soup4)
'<html><body><div><b>soup 4</b></div></body></html>'
^^^^^^^^^^^^ ^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我不需要<html><body>..</body></html>BS4添加的外部标签.我查看了BS4文档并在类中搜索但是找不到任何设置来抑制输出中的额外标记.我该怎么做?降级到V3是不是一种选择,因为在BS3中使用的SGML解析器不近的一样好lxml或html5lib可用以BS4解析器.
我试图用BeautifulSoup从html文档中获取一些文本.在一个非常相关的案例中,它产生了一个奇怪而有趣的结果:在某个点之后,汤在文本中充满了额外的空间(一个空格将每个字母与下一个字母分开).我试图搜索网络以找到原因,但我只遇到了一些有关相反错误的消息(根本没有空格).
你有什么建议或暗示它为什么会发生,以及如何解决这个问题?
这是我创建的最基本的代码:
from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen("http://www.beppegrillo.it")
prova = html.read()
soup = BeautifulSoup(prova)
print soup
Run Code Online (Sandbox Code Playgroud)
这是从结果中得到的一条线,这个问题开始出现的那一行:
value = \"Giuseppe labbate ogm?non vorremmo nuovi uccelli chiamati lontre \"> <input onmouseover = \"提示('<cen terclass =\\'title _ video\\'> <b> G iuseppelabbateogm?nonvorremmonuoviuccel lichiamatilontre <
我想解析网页http://dcsd.nutrislice.com/menu/meadow-view/lunch/来抓住今天的午餐菜单.(我已经建立了一个Adafruit #IoT热敏打印机,我想每天自动打印菜单.)
我最初使用BeautifulSoup来解决这个问题,但事实证明大部分数据都是用JavaScript加载的,我不确定BeautifulSoup可以处理它.如果您查看来源,您将看到存储的相关数据bootstrapData['menuMonthWeeks'].
import urllib2
from BeautifulSoup import BeautifulSoup
url = "http://dcsd.nutrislice.com/menu/meadow-view/lunch/"
soup = BeautifulSoup(urllib2.urlopen(url).read())
Run Code Online (Sandbox Code Playgroud)
这是获取源和审查的简便方法.
我的问题是:提取这些数据的最简单方法是什么,以便我可以用它做点什么?从字面上看,我想要的只是一个字符串:
西南芝士煎蛋卷,马铃薯楔,收获吧(THB),THB - 芝士香蒜酱面包,火腿熟食三明治,红辣椒棒,草莓
我已经考虑过使用webkit处理页面并获取HTML(即浏览器的功能),但这似乎不必要地复杂.我宁愿简单地找到可以解析bootstrapData['menuMonthWeeks']数据的东西.
以下命令:
volume = soup.findAll("span", {"id": "volume"})[0]
Run Code Online (Sandbox Code Playgroud)
得到:
<span class="gr_text1" id="volume">16,103.3</span>
Run Code Online (Sandbox Code Playgroud)
当我发出印刷品(卷)时.
我如何得到这个数字?
我试图从页面中获取div id列表.当我打印出属性时,我会列出ID.
for tag in soup.find_all(class_="bookmark blurb group") :
print(tag.attrs)
Run Code Online (Sandbox Code Playgroud)
结果是:
{'id': 'bookmark_8199633', 'role': 'article', 'class': ['bookmark', 'blurb', 'group']}
{'id': 'bookmark_7744613', 'role': 'article', 'class': ['bookmark', 'blurb', 'group']}
{'id': 'bookmark_7338591', 'role': 'article', 'class': ['bookmark', 'blurb', 'group']}
{'id': 'bookmark_7338535', 'role': 'article', 'class': ['bookmark', 'blurb', 'group']}
{'id': 'bookmark_4530078', 'role': 'article', 'class': ['bookmark', 'blurb', 'group']}
Run Code Online (Sandbox Code Playgroud)
所以我知道有些ID.但是,当我打印出tag.id时,我只得到一个"无"列表.我在这做错了什么?
我想选择所有将A和B分别作为类属性的div.
以下选择
soup.findAll('div', class_=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)
但是选择在其类属性中具有EITHER A或B的所有div.类可以有任何顺序的许多其他属性(C,D等),但我想只选择那些同时具有A和B的属性.
beautifulsoup ×10
python ×10
html ×5
html-parsing ×4
javascript ×1
parsing ×1
pip ×1
regex ×1
text ×1
web-scraping ×1