无法以正确的方式从网页中获取项目

时间:2018-06-11 15:33:38

标签: python python-3.x web-scraping

当我运行脚本从网页上获取电话号码时,脚本会以杂乱的方式执行此操作。我为了达到同一目标而粘贴了两个不同的脚本。

我想坚持使用oneliner解决方案(第二个脚本)。如何修改我的第二个脚本以摆脱第一个脚本的空白?他们的机器人以相同的方式工作,但为什么输出的变化?

Check out this website link

这几乎准确(只有一个空格):

template <typename F, typename OperatorType>
struct has_defulat_arg_impl : std::false_type {};

template <typename F, typename R, typename... Args>
struct has_defulat_arg_impl<F, R(F::*)(Args...) const>    
    : is_invocable_for_indices<F, std::make_index_sequence<sizeof...(Args) - 1>, Args...> {};

// specialization for the case where sizeof...(Args) == 0
template <typename F, typename R>
struct has_defulat_arg_impl<F, R(F::*)() const> : std::false_type {};

template <typename F>
using has_defulat_arg = has_defulat_arg_impl<F, decltype(&F::operator())>;

template <typename F>
inline constexpr bool has_defulat_arg_v = has_defulat_arg<F>::value;

// example use
auto f = [](int i = 0) {};
auto g = [](int i) {};
static_assert(has_defulat_arg_v<decltype(f)>);
static_assert(!has_defulat_arg_v<decltype(g)>);

我希望我的脚本如下所示。它也会获取正确的项目,但会出现大量的空白。

from bs4 import BeautifulSoup
import requests

url = "replace with above link"

req = requests.get(url)
sauce = BeautifulSoup(req.text,"lxml")
for items in sauce.select_one("table[width='610']").select("tr"):
    for item in items.select("td"):
        if "phone" in item.text:
            print(item.find_next_sibling().get_text())

我希望得到的结果(周围没有空格):

from bs4 import BeautifulSoup
import requests

url = "replace with above link"

req = requests.get(url)
sauce = BeautifulSoup(req.text,"lxml")
for items in sauce.select_one("table[width='610']").select("tr"):
    phone = [item.find_next_sibling().get_text() for item in items.select("td") if "phone" in item.text]
    print(phone)

这就是嵌入该网站的方式:

212 22 24 24 57

2 个答案:

答案 0 :(得分:1)

可以使用strip()删除字符串中的尾随和前导空格。

对于第一个解决方案,只需执行此操作:

phone = []

for items in sauce.select_one("table[width='610']").select("tr"):
    for item in items.select("td"):
        if "phone" in item.text:
            numbers.append(item.find_next_sibling().text.strip())

print(phone)

第二种解决方案不起作用,因为您正在为循环的每次迭代创建和打印新列表。如果要使用列表推导,则必须执行相同的嵌套循环:

 phone = [item.find_next_sibling().get_text().strip() for items in sauce.select_one("table[width='610']").select("tr") for item in items.select("td") if "phone" in item.text]

 print(phone)

我个人认为第一种选择更容易理解。

答案 1 :(得分:0)

我无法检查或测试您的示例(我收到请求错误urllib3) 我想你需要尝试这样的事情:

req = requests.get(url)
sauce=BeautifulSoup(req.content,"html5lib")

table=sauce.find("div",{"color":"#919CBA"})

for rows in table:
    tabs=rows.find_all("tr")
    for trtag in tabs:
        phone.append(trtag.find("td"))

print(phone)