我喜欢Python中的Beautiful Soup抓图库.它只是有效.Ruby中是否有相当的等价物?
可以PhantomJS使用的替代BeautifulSoup?
我正在尝试搜索Etsy并访问所有链接.在Python中,我知道如何做到这一点(使用BeautifulSoup)但今天我想知道我是否可以使用PhantomJS做同样的事情.我没有走得太远.
该脚本应在Etsy上搜索"hello kitty"并返回所有产品
<a class="listing-thumb" href=...></a>并在控制台中打印.理想情况下,我稍后会访问它们并获取我需要的信息.现在它只是冻结了.有任何想法吗?
var page = require('webpage').create();
var url = 'http://www.etsy.com/search?q=hello%20kitty';
page.open(url, function(status){
// list all the a.href links in the hello kitty etsy page
var link = page.evaluate(function() {
return document.querySelectorAll('a.listing-thumb');
});
for(var i = 0; i < link.length; i++){ console.log(link[i].href); }
phantom.exit();
});
Run Code Online (Sandbox Code Playgroud)
我玩过CasperJS玩具,可能更适合这个.
我正在尝试将我通过BeautifulSoup提取的表转换为JSON.
到目前为止,我已设法隔离所有行,但我不确定如何使用此处的数据.任何建议将非常感谢.
[<tr><td><strong>Balance</strong></td><td><strong>$18.30</strong></td></tr>,
<tr><td>Card name</td><td>Name</td></tr>,
<tr><td>Account holder</td><td>NAME</td></tr>,
<tr><td>Card number</td><td>1234</td></tr>,
<tr><td>Status</td><td>Active</td></tr>]
Run Code Online (Sandbox Code Playgroud)
(为了便于阅读,我打破了线路)
这是我的尝试:
result = []
allrows = table.tbody.findAll('tr')
for row in allrows:
result.append([])
allcols = row.findAll('td')
for col in allcols:
thestrings = [unicode(s) for s in col.findAll(text=True)]
thetext = ''.join(thestrings)
result[-1].append(thetext)
Run Code Online (Sandbox Code Playgroud)
这给了我以下结果:
[
[u'Card balance', u'$18.30'],
[u'Card name', u'NAMEn'],
[u'Account holder', u'NAME'],
[u'Card number', u'1234'],
[u'Status', u'Active']
]
Run Code Online (Sandbox Code Playgroud) 所以我正在报废的页面包含这些HTML代码.如何<!-- -->使用bs4删除评论标记及其内容?
<div class="foo">
cat dog sheep goat
<!--
<p>NewPP limit report
Preprocessor node count: 478/300000
Post?expand include size: 4852/2097152 bytes
Template argument size: 870/2097152 bytes
Expensive parser function count: 2/100
ExtLoops count: 6/100
</p>
-->
</div>
Run Code Online (Sandbox Code Playgroud) 我已经研究过这个问题,但还没有看到解决这个问题的实际解决方案.我正在使用带有Python的BeautifulSoup,我正在寻找的是从页面获取所有图像标记,循环遍历每个标记并检查每个标记以查看它的直接父标记是否为锚标记.
这是一些伪代码:
html = BeautifulSoup(responseHtml)
for image in html.findAll('img'):
if (image.parent.name == 'a'):
image.hasParent = image.parent.link
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
我有一个XML文件,其中包含已定义的结构但标签数量不同,例如
file1.xml:
<document>
<subDoc>
<id>1</id>
<myId>1</myId>
</subDoc>
</document>
Run Code Online (Sandbox Code Playgroud)
file2.xml:
<document>
<subDoc>
<id>2</id>
</subDoc>
</document>
Run Code Online (Sandbox Code Playgroud)
现在我想检查标签是否myId退出.所以我做了以下事情:
data = open("file1.xml",'r').read()
xml = BeautifulSoup(data)
hasAttrBs = xml.document.subdoc.has_attr('myID')
hasAttrPy = hasattr(xml.document.subdoc,'myID')
hasType = type(xml.document.subdoc.myid)
Run Code Online (Sandbox Code Playgroud)
结果是file1.xml:
hasAttrBs -> False
hasAttrPy -> True
hasType -> <class 'bs4.element.Tag'>
Run Code Online (Sandbox Code Playgroud)
file2.xml:
hasAttrBs -> False
hasAttrPy -> True
hasType -> <type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)
好的,<myId>不是属性<subdoc>.
但是,如果存在子标签,我该如何测试?
//编辑:顺便说一下:我真的不喜欢通过整个子块进行迭代,因为这将非常慢.我希望找到一种可以直接解决/询问该元素的方法.
有没有人知道在Python中使用HTML实体代码(例如< &)将字符串转换为普通字符串(例如<&)的简单方法?
cgi.escape()将逃脱字符串(很差),但没有unescape().
我正在使用BeautifulSoup tables在HTML中查找.我目前遇到的问题是在class属性中使用空格.如果我的HTML读取<html><table class="wikitable sortable">blah</table></html>,我似乎无法使用以下内容提取它(我可以在tables两者中找到它wikipedia并且wikipedia sortable用于class):
BeautifulSoup(html).findAll(attrs={'class':re.compile("wikitable( sortable)?")})
Run Code Online (Sandbox Code Playgroud)
如果我的HTML就是这样,我们会找到该表<html><table class="wikitable">blah</table></html>.同样,我尝试"wikitable sortable"在我的正则表达式中使用,但也不匹配.有任何想法吗?
我有很多这样的表行:
<tr>
<td>100</td>
<td>200</td>
<td><input type="radio" value="123599"></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
迭代:
table = BeautifulSoup(response).find(id="sometable") # Make soup.
for row in table.find_all("tr")[1:]: # Find rows.
cells = row.find_all("td") # Find cells.
points = int(cells[0].get_text())
gold = int(cells[1].get_text())
id = cells[2].input['value']
print id
Run Code Online (Sandbox Code Playgroud)
错误:
File "./script.py", line XX, in <module>
id = cells[2].input['value']
TypeError: 'NoneType' object has no attribute '__getitem__'
Run Code Online (Sandbox Code Playgroud)
我怎样才能获得输入值?我不想使用正则表达式.
我试图从网站上刮取表格数据.
这是一个简单的示例表:
t = '<html><table>' +\
'<tr><td class="label"> a </td> <td> 1 </td></tr>' +\
'<tr><td class="label"> b </td> <td> 2 </td></tr>' +\
'<tr><td class="label"> c </td> <td> 3 </td></tr>' +\
'<tr><td class="label"> d </td> <td> 4 </td></tr>' +\
'</table></html>'
Run Code Online (Sandbox Code Playgroud)
期望的解析结果是 {' a ': ' 1 ', ' b ': ' 2 ', ' c ': ' 3 ', ' d ' : ' 4' }
这是我迄今为止最接近的尝试:
for tr in s.findAll('tr'):
k, v = BeautifulSoup(str(tr)).findAll('td')
d[str(k)] = str(v)
Run Code Online (Sandbox Code Playgroud)
结果是:
{'<td class="label"> …Run Code Online (Sandbox Code Playgroud) beautifulsoup ×10
python ×9
html ×4
html-parsing ×2
casperjs ×1
html-table ×1
javascript ×1
json ×1
phantomjs ×1
ruby ×1
tags ×1
testing ×1
web-scraping ×1
xml ×1